package gemsa.modeles;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;

import java.util.ArrayList;
import java.util.List;

import gemsa.beans.Ssaxe;
import gemsa.beans.Axe;
import gemsa.outils.GestionBaseDeDonnees;
import gemsa.modeles.ModeleAxe;


/**
 * Classe ModeleSousAxe
 * @author Projet Dev Groupe 33
 * @version 1.0 Finale
 */
 
public class ModeleSousAxe 
{
	// Variables
	DataSource datasource=null;
	Connection connexion=null;
	ResultSet resultat=null;
	
	// Variables de pagination
	private int maxParPage;
	private int pageActuel;
	private int totalElement;
	
	// Constructeur par d�faut
	public ModeleSousAxe(DataSource datasource)
	{		
		this.datasource=datasource;
	}
	
	// Accesseurs
	public int getMaxParPage() 
	{
		return maxParPage;
	}

	public int getPageActuel() 
	{
		return pageActuel;
	}

	public int getTotalElement() 
	{
		return totalElement;
	}
	
	// Retourner la liste des sous-axes
	public List<Ssaxe> listeSousAxe()
	{
		// Variables
		PreparedStatement requete=null;
		Ssaxe ssaxe=null;
		String requeteString=null;
		List<Ssaxe> listeSousAxe=new ArrayList<Ssaxe>();
		
		try
		{
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="SELECT * FROM ssaxe ORDER BY nomssaxe ASC";
			
			// On pr�pare la requ�te
			requete=connexion.prepareStatement(requeteString);
				
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					ssaxe=ssaxeAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste des sous-axes
					listeSousAxe.add((Ssaxe)ssaxe);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction listeSousAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction listeSousAxe");
			}	
		}
		
		// Retourner la liste des axes
		return listeSousAxe;
	}
	
	
	// R�cup�rer la liste des sous-axes
	public List<Ssaxe> listerSousAxe(int idAxe, int maxParPage, int pageActuel)
	{	
		// Variables
		PreparedStatement requete=null;
		Ssaxe ssaxe=null;
		String requeteString=null;
		List<Ssaxe> listeSousAxe=new ArrayList<Ssaxe>();
		int position=0;
		ResultSet resultat2 = null;
	
		try
		{			
			// Ouverture d'une connexion
			connexion = datasource.getConnection();
		
			// Premi�re requ�te : on r�cup�re le nombre total de sous-axes
			
			// On cr�� la requ�te
			requeteString="SELECT COUNT(DISTINCT(ssaxe.id_ssaxe)) as total FROM ssaxe WHERE etatssaxe=1";
		
			// S'il s'agit d'un listing de sous-axes en fonction de l'axe, on modifie la requ�te en cons�quence
			if(idAxe!=0)
			{
				requeteString+=" AND id_axe=?";
				
				// On pr�pare la requ�te
				requete=connexion.prepareStatement(requeteString);
				requete.setInt(1,idAxe);
			}
			// Dans le cas contraire on liste tous les sous-axes
			else
			{
				// On pr�pare la requ�te
				requete=connexion.prepareStatement(requeteString);
			}
			System.out.println("----------------------> requeteString = " + requeteString + "("+idAxe+")");
			
			// Execution de la requ�te
			resultat2=requete.executeQuery();
			
			// On r�cup�re le nombre de sous-axes
			if(resultat2!=null)
			{
				if(resultat2.next())
				{
					this.totalElement=resultat2.getInt("total");
				}
			}
			
			// On v�rifie que la page demand�e est valable
			position=maxParPage*(pageActuel-1);
			if(position>totalElement || maxParPage>totalElement)
			{
				pageActuel=1;
			}
			
			// On d�finit les variables de pagination finales
			position=maxParPage*(pageActuel-1);
			this.maxParPage=maxParPage;
			this.pageActuel=pageActuel;
			
			// Deuxi�me requ�te : on r�cup�re la liste suivant une pagination
			requeteString="SELECT * FROM ssaxe WHERE etatssaxe=1";
			
			// Si il s'agit d'un listing de ssaxes en fonction de l'axe, on modifie la requ�te en cons�quence
			if(idAxe!=0)
			{
				requeteString+=" AND id_axe=?";
				// requeteString+=" LIMIT " + position + " OFFSET " + maxParPage;
				
				// On pr�pare la requ�te
				requete=connexion.prepareStatement(requeteString);
				requete.setInt(1, idAxe);
			}
			// Dans le cas contraire on liste tous les ssaxes
			else
			{
				//requeteString+=" LIMIT " + position + " OFFSET " + maxParPage;
				
				// On pr�pare la requ�te
				requete=connexion.prepareStatement(requeteString);
			}

	
			// Execution de la requ�te
			resultat2=requete.executeQuery();

			// On stocke le resultat une la liste de sous-axes
			if(resultat2!=null)
			{
				while(resultat2.next())
				{
					// On effectue le mappage des attributs avec les champs de la table SQL
					ssaxe=ssaxeAttributsMapper(resultat2);
					
					// Ajoute l'objet a la liste de sous-axes
					listeSousAxe.add((Ssaxe)ssaxe);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction listeSousAxe");
		}
		
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat2!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat2);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction listerSousAxe");
			}	
		}
		
		// Retourner la liste des sous-axes
		return listeSousAxe;
	}
	
	
	
	
	// Récupérer un sous-axe
	public Ssaxe getSsaxe(int idSsaxe)
	{	
		// Variables
		PreparedStatement requete=null;
		Ssaxe ssaxe=null;
		String requeteString=null;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="SELECT * FROM ssaxe WHERE id_ssaxe=?";
			
			// On pr�pare la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idSsaxe);
				
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans l'objet ssaxe
			if(resultat!=null)
			{
				if(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					ssaxe=ssaxeAttributsMapper(resultat);
				}
			}
		}
		catch(Exception e)
		{
			// L'id du sous-axe n'existe pas, on initialise le sous-axe � null
			ssaxe=null;
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction getSsaxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction getSsaxe");
			}	
		}
		
		// Retourner le ssaxe
		return ssaxe;
	}
	
	
	
	
	/* =========================================
	 * Partie Admin
	 * =========================================
	 */
	
	// Retourner la liste des sous-axes
	public List<Ssaxe> listeSousAxeAdmin(int maxParPage, int pageActuel)
	{	
		// Variables
		PreparedStatement requete=null;
		Ssaxe ssaxe=null;
		String requeteString=null;
		List<Ssaxe> listeSousAxe=new ArrayList<Ssaxe>();
		int position=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Premi�re requ�te : on r�cup�re le nombre total de sous-axes
			requeteString="SELECT COUNT(DISTINCT(ssaxe.id_ssaxe)) as total FROM ssaxe WHERE 1";
		
			// Pr�paration de la requ�te
			requete=connexion.prepareStatement(requeteString);
			
			// Execution de la requ�te
			resultat=requete.executeQuery();
			
			// On r�cup�re le nombre de ssaxes
			if(resultat!=null)
			{
				if(resultat.next())
				{
					this.totalElement=resultat.getInt("total");
				}
			}
			// On v�rifie que la page demand�e est valable
			position=maxParPage*(pageActuel-1);
			if(position>totalElement || maxParPage>totalElement)
			{
				pageActuel=1;
			}
			
			// On d�finit les variables de pagination finale
			position=maxParPage*(pageActuel-1);
			this.maxParPage=maxParPage;
			this.pageActuel=pageActuel;
		
			// Deuxi�me requ�te : on r�cup�re la liste suivant une pagination
			requeteString="SELECT * FROM ssaxe WHERE 1";
		
			requeteString+=" LIMIT " + position + " OFFSET " + maxParPage;
			
			// Pr�paration de la requ�te
			requete=connexion.prepareStatement(requeteString);
	
			// Execution de la requ�te
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					ssaxe=ssaxeAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste d'ssaxes
					listeSousAxe.add((Ssaxe)ssaxe);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction ListeSousAxeAdmin");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction ListeSousAxeAdmin");
			}	
		}
		
		// Retourner la liste des sous-axes
		return listeSousAxe;
	}
	
	
	
	// Ajouter un sous-axe
	public int ajouterSousAxe(Ssaxe ssaxe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="INSERT INTO ssaxe (nomssaxe, descriptionssaxe, etatssaxe, id_axe) VALUES(?,?,?,?)";
			
			// Pr�paration de la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setString(1, ssaxe.getNom());
			requete.setString(2, ssaxe.getDescription());
			requete.setInt(3, ssaxe.getEtat());
			requete.setInt(4, ssaxe.getAxe().getId());
			
			// On vide le sous-axe par s�curit�
			ssaxe = null;
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction ajouterSousAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction ajouterSousAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	// Supprimer un sous-axe
	public int supprimerSousAxe(int idSsaxe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{		
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Annulation de l'autocommit
			connexion.setAutoCommit(false);
			
			// Premi�re requ�te : suppression du sous-axe
			requeteString="DELETE FROM ssaxe WHERE id_ssaxe = ?";
			
			// Pr�paration de la requ�te
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, idSsaxe);
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
			
			// Si il n'y a pas eu d'erreur durant la suppression du sous-axe, on fait un commit, sinon un rollback.
			if(codeErreur==1)
			{
				GestionBaseDeDonnees.commit(connexion);
			}
			else
			{
				GestionBaseDeDonnees.rollback(connexion);
			}
		}
		catch(Exception e)
		{
			codeErreur=0;
			GestionBaseDeDonnees.rollback(connexion);
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction supprimerSousAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction supprimerSousAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	
	// Modifier un sous-axe
	public int modifierSousAxe(Ssaxe ssaxe)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requ�te
			requeteString="UPDATE ssaxe set nomssaxe = ?, descriptionssaxe = ?, etatssaxe = ?, id_axe = ? WHERE id_ssaxe = ?";
			requete=connexion.prepareStatement(requeteString);
			requete.setString(1, ssaxe.getNom());
			requete.setString(2, ssaxe.getDescription());
			requete.setInt(3, ssaxe.getEtat());
			requete.setInt(4, ssaxe.getAxe().getId());
			requete.setInt(5, ssaxe.getId());
			
			// On vide le sous-axe par s�curit�
			ssaxe=null;
			
			// Execution de la requ�te
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleSousAxe fonction modifierSousAxe");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleSousAxe fonction modifierSousAxe");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	// R�aliser la transformation Relationnel vers Objet
	public Ssaxe ssaxeAttributsMapper(ResultSet resultat)
	{
		// Variables
		Ssaxe ssaxe=null;
		ModeleAxe modeleAxe=null;
		
		// Initialisation des mod�les
		modeleAxe=new ModeleAxe(this.datasource);
		
		// Initalisation de l'objet sous-axe
		ssaxe=new Ssaxe();
		
		
		try
		{	
			// On renseigne l'objet ssaxe
			if(resultat.getString("id_ssaxe")==null)
			{
				ssaxe.setId(0);
			}
			else
			{
				ssaxe.setId(resultat.getInt("id_ssaxe"));
			}
			
			if(resultat.getString("nomssaxe")==null)
			{
				ssaxe.setNom("");
			}
			else
			{
				ssaxe.setNom(resultat.getString("nomssaxe"));
			}
			
			if(resultat.getString("descriptionssaxe")==null)
			{
				ssaxe.setDescription("");
			}
			else
			{
				ssaxe.setDescription(resultat.getString("descriptionssaxe"));
			}
	
			if(resultat.getString("etatssaxe")==null)
			{
				
				ssaxe.setEtat(0);
			}
			else
			{
				ssaxe.setEtat(resultat.getInt("etatssaxe"));
			}
			
			if(resultat.getString("id_axe")==null)
			{
				ssaxe.setAxe(new Axe());
			}
			else
			{
				ssaxe.setAxe(modeleAxe.getAxe(resultat.getInt("id_axe")));
			}
			
		}
		catch (Exception e) 
		{
			// Si il y a une erreur durant le mapping des attributs avec la base on renvoi un objet null
			ssaxe=null;
			//System.out.println("Erreur lors du mappage des attributs d'un sous-axe dans la classe ModeleSousAxe fonction SousAxeAttributsMapper");
			e.printStackTrace();
		}
		
		// On retourne le sous-axe
		return ssaxe;
	}
	
	
}
